package com.example.lxj.system.service.impl;


import cn.hutool.core.date.DateUtil;
import com.example.lxj.system.entity.SysRole;
import com.example.lxj.system.entity.SysRoleMenu;
import com.example.lxj.system.mapper.SysRoleMapper;
import com.example.lxj.system.service.ISysRoleMenuService;
import com.example.lxj.system.service.ISysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;


/**
 * 角色信息Service业务层处理
 */
@Service
public class SysRoleServiceImpl implements ISysRoleService
{
    @Autowired
    private SysRoleMapper sysRoleMapper;

    @Autowired
    private ISysRoleMenuService sysRoleMenuService;

    /**
     * 查询角色信息
     * 
     * @param roleId 角色信息主键
     * @return 角色信息
     */
    @Override
    public SysRole selectSysRoleByRoleId(Long roleId)
    {
        return sysRoleMapper.selectSysRoleByRoleId(roleId);
    }

    /**
     * 查询角色信息列表
     * 
     * @param sysRole 角色信息
     * @return 角色信息
     */
    @Override
    public List<SysRole> selectSysRoleList(SysRole sysRole)
    {
        return sysRoleMapper.selectSysRoleList(sysRole);
    }

    /**
     * 新增角色信息
     * 
     * @param sysRole 角色信息
     * @return 结果
     */
    @Transactional
    @Override
    public int insertSysRole(SysRole sysRole)
    {
        sysRole.setCreateTime(DateUtil.date());
        // 批量添加角色和菜单关联
        ArrayList<SysRoleMenu> sysRoleMenus = new ArrayList<>();
        int i = sysRoleMapper.insertSysRole(sysRole);
        if(0 < i){
            for (Long menuId : sysRole.getMenuIds()){
                sysRoleMenus.add(new SysRoleMenu(sysRole.getRoleId(), menuId));
            }
            return !sysRoleMenus.isEmpty() ? sysRoleMenuService.insertMultiSysRoleMenu(sysRoleMenus) : 1;
        }else{
            return -1;
        }
    }

    /**
     * 修改角色信息
     * 
     * @param sysRole 角色信息
     * @return 结果
     */
    @Transactional
    @Override
    public int updateSysRole(SysRole sysRole)
    {
        sysRole.setUpdateTime(DateUtil.date());
        // 先删除对应的角色菜单再插入
        sysRoleMenuService.deleteSysRoleMenuByRoleId(sysRole.getRoleId());
        // 批量添加角色和菜单关联
        ArrayList<SysRoleMenu> sysRoleMenus = new ArrayList<>();
        for (Long menuId : sysRole.getMenuIds()){
            sysRoleMenus.add(new SysRoleMenu(sysRole.getRoleId(), menuId));
        }
        int i = !sysRoleMenus.isEmpty() ? sysRoleMenuService.insertMultiSysRoleMenu(sysRoleMenus) : 1;
        if(0 < i){
            return sysRoleMapper.updateSysRole(sysRole);
        }else{
            return -1;
        }
    }

    /**
     * 批量删除角色信息
     * 
     * @param roleIds 需要删除的角色信息主键
     * @return 结果
     */
    @Override
    public int deleteSysRoleByRoleIds(Long[] roleIds)
    {
        return sysRoleMapper.deleteSysRoleByRoleIds(roleIds);
    }

    /**
     * 删除角色信息信息
     * 
     * @param roleId 角色信息主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteSysRoleByRoleId(Long roleId)
    {
        // 先删除角色关联菜单
        int i = sysRoleMenuService.deleteSysRoleMenuByRoleId(roleId);
        if(0 <= i) {
            return sysRoleMapper.deleteSysRoleByRoleId(roleId);
        }else{
            return -1;
        }
    }
}
